#pragma once
#include<stdlib.h>
#include<functional>
using namespace std;
class Caltask
{
    typedef function<int(int,int,char)> fun_c;
public:
Caltask(){}//无参构造

Caltask(int x,int y,char op,fun_c func)
:_x(x)
,_y(y)
,_op(op)
,_caltask(func)
{}

string operator()()//()运算符重载
{
int ret=_caltask(_x,_y,_op);//调用外部传进来的计算任务
char buffer[128];
snprintf(buffer,sizeof buffer,"%d %c %d =%d ",_x,_op,_y,ret);
return buffer;
}

string taskstringforP()
{
    char buffer[128];
    snprintf(buffer,sizeof buffer,"%d %c %d =?",_x,_op,_y);
    return buffer;
}

private:
int _x;//参数一
int _y;//参数二
char _op;//运算符号
fun_c _caltask;//需调用的外部计算函数
};


class SaveTask
{
    typedef function<void(string)> fun_c;
public:
SaveTask(){}//默认构造

SaveTask(  string & s,fun_c func)
:_str(s)
,_func(func)
{}

void operator()()
{
    _func(_str);
}

private:
string _str;
fun_c _func;
};

void tosave(const string&s)
{
    string target="./log.txt";//文件的路径
    FILE*fp=fopen(target.c_str(),"a+");// 以追加的方式打开文件
    if(!fp)//文件打开失败
    {
        cout<<"fopen error"<<endl;
    }

 fputs(s.c_str(),fp);//往文件里面写数据
 fputs("\n",fp);// 往文件里面写换行符
 fclose(fp);//关闭文件
}

const string oper="+-*/%";
int mymath(int x,int y,char op)
{
    int ret=0;
    switch(op)
    {
        case '+':
       ret=x+y;
        break;

        case '-':
        ret=x-y;
        break;  

        case '*':
        ret=x*y;
        break;        
        
        case '/':
        if(y==0)
        {
            cerr<<"div zero erro!"<<endl;
            ret=-1;
        }else
        {
            ret=x/y;
        }
        break;        
        
        case '%':
        if(y==0)
        {
            cerr<<"div zero erro!"<<endl;
            ret=-1;
        }else
        {
            ret=x%y;
        }
        break;

        default:
        //do nothing
        break;
    }
    return ret;
}
